package com.xucy.springboot.designmodel.creational.single;

/**
 * @Author xucy
 * @Date 2019-07-16 19:38
 * @Description
 **/

public class Product {

    /**volatile用于保证 变量可以随时可见，防止重排序*/
    private volatile static Product product;

    private Product(){
        System.out.println("初始化了");
    }

    public static Product createProduct(){
        if(product==null){
            synchronized(Product.class){
                if(product==null){
                    //因为这个地方可能会指令重排序，因为创建product分3步，1.给对象分配内存 2.创建对象 3.product指向内存  2，3步可能会重排序。
                    //当线程1中product先指向内存了，但是没有创建对象，这时候线程2 进来了 看到product指向不为空，就开始用product 但是对象并未创建，所以会报错。
                    //这时候两个解决办法，1.volatile修饰product 保证对象可见 2.静态内部类，保证线程1操作，线程2看不到
                    product=new Product();
                    return product;
                }else{
                    return product ;
                }
            }
        }else{
            return product;
        }

    }


    private static class innerClass{
        private static Product instance=new Product();
    }

    public static Product newProduct(){
        return innerClass.instance;
    }

    public static void testStatic(){
        System.out.println("调用testStatic");
    }
}
